package com.aiti.lulian.controller;

import cn.hutool.core.util.StrUtil;
import com.aiti.base.core.base.controller.WebController;
import com.aiti.base.core.utils.message.Message;
import com.aiti.base.core.utils.obj.BeanCopyUtil;
import com.aiti.base.core.utils.stringUtil.StringUtil;
import com.aiti.lulian.dto.SysDataDto;
import com.aiti.lulian.entity.SysData;
import com.aiti.lulian.entity.tree.TreeSelect;
import com.aiti.lulian.service.ISysDataService;
import com.aiti.lulian.vo.DataVo;
import com.aiti.lulian.vo.SysDataVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @Author ZhouS
 * @CreateDate 2022-07-09
 * @Description:
 */
@RestController
@RequestMapping("sysData")
@Api(tags = "sysData", description = "sysData")
public class SysDataController extends WebController {

    protected final Logger logger = LoggerFactory.getLogger(SysDataController.class);


    @Autowired
    private ISysDataService sysDataService;

    @ApiOperation(value="保存")
    @PostMapping("")
    public Message addSysData(@RequestBody SysDataDto sysDataDto) {
        try {
            SysData sysData = BeanCopyUtil.convertBean(sysDataDto, SysData.class);
            sysData.setCreator(findUserId());
            sysData.setBaseCreateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            sysData.setBaseUpdateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            int sort = 1;
            if (sysDataDto.getSort() == null) {
                List<SysData> list = sysDataService.list(new LambdaQueryWrapper<SysData>().eq(SysData::getBaseParentId, sysDataDto.getBaseParentId()).eq(SysData::getTypeId, sysDataDto.getTenantId()).eq(SysData::getStatus, "0").orderByDesc(SysData::getSort));
                if (list.size() > 0) {
                    SysData data = list.get(0);
                    if (data.getSort() != null) {
                        sort = data.getSort() + 1;
                    }
                }
            }
            sysData.setSort(sort);
            sysData.setStatus("0");
            return Success(sysDataService.save(sysData));
        } catch (Exception e) {
            logger.error("保存异常：===》" + e);
            return Error(e.getMessage());
        }
    }

    @ApiOperation(value="编辑")
    @PutMapping("/update")
    public Message updateSysData(@RequestBody SysDataDto sysDataDto) {
        try {
            SysData sysData = BeanCopyUtil.convertBean(sysDataDto, SysData.class);
            sysData.setUpdateBy(findUserId());
            sysData.setBaseUpdateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            return Success(sysDataService.updateById(sysData));
        } catch (Exception e) {
            logger.error("编辑异常：===》" + e);
            return Error(e.getMessage());
        }
    }

    @ApiOperation(value = "逻辑删除")
    @DeleteMapping("/remove/{baseId}")
    public Message deleteSysData(@PathVariable("baseId") String baseId){
        try {
            if (StrUtil.isBlank(findUserId())) {
                return Message.fail("请先登录");
            }
            return Success(sysDataService.update(new LambdaUpdateWrapper<SysData>().eq(SysData::getBaseId, baseId).set(SysData::getIsDelete, 1).set(SysData::getUpdateBy, findUserId()).set(SysData::getBaseUpdateTime, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))));
        } catch(Exception e) {
            logger.error("删除异常：===》" + e);
            return Error(e.getMessage());
        }
    }

    @ApiOperation(value="查询所有")
    @GetMapping()
    public Message getSysDataList() {
        try {
            return Success(sysDataService.list());
        }catch (Exception e){
            logger.error("查询异常：===》" + e);
            return Error(e.getMessage());
        }
    }

    @ApiOperation(value = "查询列表-分页")
    @GetMapping("sysDataListPage")
    public Message sysDataListPage(SysDataDto sysDataDto) {
        try {
            Integer pageSize = sysDataDto.getPageSize();
            Integer pageNum = sysDataDto.getPageNum();
            Page<SysData> page = startPage(pageNum,pageSize);
            QueryWrapper<SysData> wrapper = new QueryWrapper<SysData>();
            if(StringUtil.isNotBlank(sysDataDto.getBaseParentId())){
                wrapper.eq("base_parent_id",sysDataDto.getBaseParentId());
            }
            if(StringUtil.isNotBlank(sysDataDto.getTypeId())){
                wrapper.eq("type_id",sysDataDto.getTypeId());
            }
            IPage<SysData> pageResult = sysDataService.page(page,wrapper);
            List<SysData> list = pageResult.getRecords();
            return Success(getPageResult(list,pageNum,pageSize,(int)pageResult.getTotal()));
        }catch (Exception e){
            logger.error("查询异常：===》" + e);
            return Error(e.getMessage());
        }
    }
    @ApiOperation(value = "数据详情")
    @GetMapping("/{id}")
    public Message getSysDataInfo(@PathVariable("id") String id){
        try {
            SysData sysData = sysDataService.byId(id);
            return Success(sysData);
        }catch (Exception e){
            logger.error("查询异常：===》" + e);
            return Error(e.getMessage());
        }
    }
    @ApiOperation(value = "根据id更新")
    @PutMapping()
    public Message updatesysData(@RequestBody SysDataDto sysDataDto){
        try{
            SysData sysData = BeanCopyUtil.convertBean(sysDataDto, SysData.class);
            sysDataService.updateById(sysData);
            return Success();
        }catch(Exception e){
            logger.error("更新异常：===》" + e);
            return Error(e.getMessage());
        }
    }
    @ApiOperation(value = "根据baseId逻辑删除")
    @DeleteMapping("/{id}")
    public Message updateByIsDelete(@PathVariable("id") String id){
        try{
            List<String> strings = StringUtil.splitStr(id, ",");
            return Success(sysDataService.removeByIds(strings));
        }catch(Exception e){
            logger.error("删除异常：===》" + e);
            return Error(e.getMessage());
        }
    }

    @ApiOperation(value = "自定义查询列表-分页")
    @GetMapping("findSysDataListPage")
    @ApiIgnore
    public Message findSysDataListPage(SysDataDto sysDataDto) {
        try {
            Integer pageSize = sysDataDto.getPageSize();
            Integer pageNum = sysDataDto.getPageNum();
            Page<SysData> page = startPage(pageNum,pageSize);
            SysData sysData = BeanCopyUtil.convertBean(sysDataDto, SysData.class);
            List<SysData> list = sysDataService.findListPage(page,sysData);
            return Success(getPageResult(list,pageNum,pageSize,(int)page.getTotal()));
        }catch (Exception e){
            logger.error("查询异常：===》" + e);
            return Error(e.getMessage());
        }
    }

    @ApiOperation(value = "获取字段属性")
    @GetMapping("getData")
    public  Message getData(SysDataDto sysDataDto){

        SysData sysData = BeanCopyUtil.convertBean(sysDataDto, SysData.class);
        List<SysData> list =sysDataService.findListPage(null,sysData);
        return Success(list);
    }

    @ApiOperation(value = "获取字段属性")
    @GetMapping("getDataFeign")
    public  Message getDataFeign(@RequestParam(value = "typeId") String typeId, @RequestParam(value = "baseName") String baseName,
                                 @RequestParam(value = "baseParentId") String baseParentId){
        SysData result =new SysData();
        SysData sysData =new SysData();
        sysData.setTypeId(typeId);
        sysData.setBaseName(baseName);
        sysData.setBaseParentId(baseParentId);
        List<SysData> list =sysDataService.findListPage(null,sysData);
        if(list.size()>0){
            result=list.get(0);
        }
        return Success(result);
    }
    @ApiOperation(value = "获取字段属性")
    @GetMapping("getDictList")
    public  Message getDictList(SysDataDto sysDataDto){
        try {
        SysData sysData=new SysData();
        sysData.setBaseParentId(sysDataDto.getBaseParentId());
        if(StringUtils.isNotBlank(sysDataDto.getTypeId())){
            sysData.setTypeId(sysDataDto.getTypeId());
        }
        if(StringUtils.isNotBlank(sysDataDto.getTenantId())){
            sysData.setTenantId(sysDataDto.getTenantId());
        }
        List<SysData> parentList =sysDataService.findListPage(null,sysData);
        List<DataVo> dataList=new ArrayList<>();
        for (SysData dict:parentList) {
            SysData dictData=new SysData();
            dictData.setBaseParentId(dict.getBaseId());
            List<SysData> dictList=sysDataService.findListPage(null,dictData);
            DataVo dataVo=new DataVo();
            dataVo.setSysData(dict);
            dataVo.setDataList(dictList);
            dataList.add(dataVo);
        }
        return Success(dataList);
        }catch (Exception e){
            logger.error("查询异常：===》" + e);
            return Error(e.getMessage());
        }
    }
    @ApiOperation(value = "获取排序属性")
    @GetMapping("getSort")
    public  Message getSort(){
        try {
            List<SysData> dictList=sysDataService.getSorts();
            return Success(dictList);
        }catch (Exception e){
            logger.error("查询异常：===》" + e);
            return Error(e.getMessage());
        }
    }
    @ApiOperation(value = "获取二级排序属性")
    @GetMapping("getScondSort")
    public  Message getScondSort(){
        try {
            List<SysDataVo> dictList=sysDataService.getScondSort();
            return Success(dictList);
        }catch (Exception e){
            e.printStackTrace();
            logger.error("查询异常：===》" + e);
            return Error(e.getMessage());
        }
    }

    @ApiOperation(value = "(农产品)自定义查询列表-分页")
    @GetMapping("findFarmDataListPage")
    @ApiIgnore
    public Message findFarmDataListPage(SysDataDto sysDataDto) {
        try {
            Integer pageSize = sysDataDto.getPageSize();
            Integer pageNum = sysDataDto.getPageNum();
            Page<SysData> page = startPage(pageNum,pageSize);
            SysData sysData = BeanCopyUtil.convertBean(sysDataDto, SysData.class);
            List<SysData> list = sysDataService.findListPage(page,sysData);
            return Success(getPageResult(list,pageNum,pageSize,(int)page.getTotal()));
        }catch (Exception e){
            logger.error("查询异常：===》" + e);
            return Error(e.getMessage());
        }
    }


    @ApiOperation(value = "鲁链——自定义查询列表-分页")
    @GetMapping("findDictLuLian")
    @ApiIgnore
    public Message findDictLuLian(SysDataDto sysDataDto) {
        try {
            List<DataVo> dataList=new ArrayList<>();
            Integer pageSize = sysDataDto.getPageSize();
            Integer pageNum = sysDataDto.getPageNum();
            Page<SysData> page = startPage(pageNum,pageSize);
            SysData sysData = BeanCopyUtil.convertBean(sysDataDto, SysData.class);
            List<SysData>  firstList = sysDataService.findListPage(page,sysData);
            for (int i = 0; i < firstList.size(); i++) {
                SysData dictData=new SysData();
                dictData.setBaseParentId(firstList.get(i).getBaseId());
                List<SysData> dictList=sysDataService.findListPage(null,dictData);
                DataVo vo=new DataVo();
                vo.setSysData(firstList.get(i));
                vo.setDataList(dictList);
                dataList.add(vo);
            }
            return Success(dataList);
        }catch (Exception e){
            logger.error("查询异常：===》" + e);
            return Error(e.getMessage());
        }
    }

    @GetMapping("/tree")
    @ApiOperation("查询字典项树形列表")
    public Message getTree(SysData dto) {
        List<SysData> list = sysDataService.findListPage(null, dto);
        List<TreeSelect> treeSelects = sysDataService.buildMonitorAreaTreeSelect(list);
        return Message.success(treeSelects);
    }
}
